home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 February: Tool Chest / Apple Developer CD Series Tool Chest February 1996 (Apple Computer)(1996).iso / Sample Code / AOCE Sample Code / PowerTalk Access Modules / Sample PMSAM / PMSAM Dev Tools / PMSAMDevGadgets.Source / SwapPMSAM / SwapPMSAM.cp next >
Encoding:
Text File  |  1995-07-28  |  11.3 KB  |  587 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        Application.cp
  3.  
  4.     Contains:    CORE for test gadgets
  5.  
  6.     Written by:    Tim Harnett
  7.  
  8.     Copyright:    © 1994 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.                  9/29/94    TMH        xxx put comment here xxx
  13.  
  14.     To Do:
  15. */
  16.  
  17.  
  18.  
  19. #ifndef __RESOURCES__
  20. #include "Resources.h"
  21. #endif
  22.  
  23. #ifndef __Debug__
  24. #include "Debug.h"
  25. #endif
  26.  
  27. #ifndef __UFAILURE__
  28. #include "UFailure.h"
  29. #endif
  30.  
  31. #ifndef __OCEERRORS__
  32. #include "OCEErrors.h"
  33. #endif
  34.  
  35. #ifndef __BaseTypes__
  36. #include "BaseTypes.h"
  37. #endif
  38.  
  39. #ifndef __CRString__
  40. #include "CRString.h"
  41. #endif
  42.  
  43. #ifndef __CRecordID__
  44. #include "CRecordID.h"
  45. #endif
  46.  
  47. #ifndef __FileUtils__
  48. #include "FileUtils.h"
  49. #endif
  50.  
  51. #ifndef __CAttribute__
  52. #include "CAttribute.h"
  53. #endif
  54.  
  55. #ifndef __SwapPMSAM__
  56. #include "SwapPMSAM.h"
  57. #endif
  58.  
  59.  
  60.  
  61. TApplication*    gApplication        = 0;
  62. Boolean            gDone                = false;
  63. AuthIdentity    gIdentity             = 0;
  64. short            gKeyChainDSRefnum    = 0;
  65.  
  66.  
  67. //•••••••••••••
  68.  
  69. //------------------------------------
  70. //    C R e c o r d E n u m e r a t o r
  71. //-----------------------------------
  72.  
  73.  
  74. CRecordType            gWildCardRecordType("=");        // use in enumeration to mean all record types
  75. CRecordName            gWildCardRecordName("=");        // use in enumeration to mean all record names.
  76.  
  77.  
  78. //    A very simple record enumerator. That we use to find records.
  79.  
  80. const long pEnumerateRecordChunkSize = 512;
  81.  
  82. class CRecordEnumerator {
  83. public:
  84.  
  85.     CRecordEnumerator(CRecordID& matchRecord);
  86.     OSErr     Enumerate();
  87.     
  88.     
  89. private:
  90.  
  91.     
  92.     static    pascal Boolean    __EachRecordCallBack( long clientData, const DirEnumSpec *enumSpec );
  93.     virtual           Boolean    EachRecordCallBack(CreationID* cid, RString* recName,RString* recType) = 0;
  94.     
  95.     void    Get();
  96.     void    Parse();
  97.     
  98.     DirEnumSpec*    GetStartingPoint() { return 0; }
  99.  
  100. private:
  101.  
  102.     CRecordName            fMatchName;
  103.     CRecordType            fMatchType;
  104.     CPackedRLI            fWhereRLI;
  105.     
  106.     CRecordID*            fMatchRecord;
  107.     
  108.     DirParamBlock        fDSParamBlock;
  109.     DirEnumerateGetPB    *fGetPB;        // convenience
  110.     DirEnumerateParsePB    *fParsePB;
  111.     
  112.     OSErr                fOSErr;
  113.     OSErr                fParseErr;
  114.     
  115.     char*                fGetBuffer[pEnumerateRecordChunkSize];        // we assume a good sized stack.
  116.  
  117. };
  118.  
  119.  
  120. //-------------------------------------------------------------------
  121. CRecordEnumerator::CRecordEnumerator(CRecordID& match)
  122. {
  123.     fOSErr = 0;
  124.     fParseErr = 0;
  125.         
  126.     memset(&fDSParamBlock,0,sizeof(DirParamBlock));
  127.     fGetPB = (DirEnumerateGetPB*) &fDSParamBlock;
  128.     fParsePB = (DirEnumerateParsePB*) &fDSParamBlock;
  129.  
  130.  
  131.     fMatchName = *match.fName;        //    copy
  132.     fMatchType = *match.fType;        //    copy
  133.     fWhereRLI = *match.fRLI;        //    copy
  134.     
  135.     fGetPB->aRLI = fWhereRLI;
  136.  
  137.  
  138.     fDSParamBlock.header.dsRefNum = fWhereRLI.GetDSRefNum();
  139.     fDSParamBlock.header.identity = gIdentity;
  140.  
  141.  
  142.     
  143.     fGetPB->clientData = (long)this;
  144.  
  145.     fGetPB->getBuffer = (Ptr) fGetBuffer;
  146.     fGetPB->getBufferSize = pEnumerateRecordChunkSize;
  147. }
  148.  
  149. //--------------------------------------------------------------------
  150. OSErr CRecordEnumerator::Enumerate()
  151. {    
  152.         
  153.     // Loop till we get all the records
  154.     do {
  155.  
  156.         this->Get();
  157.         
  158.         if( fOSErr != 0 && fOSErr != kOCEMoreData)
  159.             break;
  160.             
  161.         this->Parse();
  162.         
  163.         if( fOSErr != 0 && ( fOSErr != kOCEMoreData && fOSErr != kOCENoSuchDNode) )
  164.             break;
  165.         
  166.     } while ( fOSErr == kOCEMoreData );
  167.     
  168.         
  169.     return fOSErr;
  170. }
  171.  
  172. //---------------------------------------------------------------------------------------------
  173. void CRecordEnumerator::Parse()
  174. {
  175.  
  176.     fParsePB->eachEnumSpec = CRecordEnumerator::__EachRecordCallBack;
  177.  
  178.     fOSErr = DirEnumerateParse((DirParamBlock*)fParsePB, false);
  179.     if( fOSErr == 0 && fParseErr != 0 )
  180.         fOSErr = fParseErr;
  181.         
  182. }
  183.  
  184.  
  185.  
  186.  
  187. //---------------------------------------------------------------------------------------------
  188. void CRecordEnumerator::Get()
  189. {
  190.     fGetPB->startingPoint        = this->GetStartingPoint();    // in case we continue.
  191.     fGetPB->sortBy                = kSortByName;
  192.     fGetPB->sortDirection        = kSortForwards;
  193.     
  194.     fGetPB->nameMatchString    = fMatchName;
  195.  
  196.  
  197.     RString*    recTypePtr = fMatchType;
  198.     fGetPB->typesList = &recTypePtr;
  199.     fGetPB->typeCount = 1;
  200.  
  201.  
  202.     fGetPB->includeStartingPoint = ( fGetPB->startingPoint != 0 );
  203.     
  204.     if( fMatchName == gWildCardRecordName )
  205.         fGetPB->matchNameHow    = kMatchAll;
  206.     else
  207.         fGetPB->matchNameHow    = kExactMatch;
  208.  
  209.  
  210.     if( (CRecordType&)**fGetPB->typesList == gWildCardRecordType )
  211.         fGetPB->matchTypeHow    = kMatchAll;
  212.     else
  213.         fGetPB->matchTypeHow    = kExactMatch;
  214.  
  215.  
  216.     fGetPB->enumFlags             = kEnumDistinguishedNameMask;
  217.     
  218.     fOSErr = DirEnumerateGet((DirParamBlock*)fGetPB, false);
  219.     
  220.  
  221. }
  222.  
  223.  
  224. //---------------------------------------------------------------------------------------------
  225. pascal Boolean CRecordEnumerator::__EachRecordCallBack(long clientData,const  DirEnumSpec* enumSpec)
  226. {
  227.     Boolean        haltEnumeration = false;
  228.  
  229.     CRecordEnumerator* thisEnumerator = (CRecordEnumerator*) clientData;
  230.     
  231.     haltEnumeration = thisEnumerator->EachRecordCallBack(&enumSpec->u.recordIdentifier.cid, enumSpec->u.recordIdentifier.recordName,enumSpec->u.recordIdentifier.recordType);
  232.             
  233.     return haltEnumeration;    
  234.  
  235. }
  236.  
  237.  
  238.  
  239. //-----------------------------------
  240. //    C F i n d E n u m e r a t o r
  241. //----------------------------------
  242.  
  243.  
  244. class CFindRecordEnumerator : public CRecordEnumerator {
  245. public:
  246.             CFindRecordEnumerator(CRecordID& findThis);
  247.     virtual Boolean    EachRecordCallBack(CreationID* cid, RString* recName,RString* recType);
  248.     CreationID&    GetCID() { return fMatchedCID; };
  249. private:
  250.     CreationID    fMatchedCID;
  251. };
  252.  
  253.  
  254. //-----------------------------------------------------------------------------
  255. CFindRecordEnumerator::CFindRecordEnumerator(CRecordID& recordToFind) : CRecordEnumerator(recordToFind)
  256. {
  257.     fMatchedCID = gZeroCID;
  258. }
  259.  
  260. //-----------------------------------------------------------------------------
  261. Boolean CFindRecordEnumerator::EachRecordCallBack(CreationID* cid, RString* /* recName*/,RString* /*recType*/)
  262. {
  263.     Boolean        haltEnumeration = true;
  264.     
  265.      fMatchedCID.source = cid->source; 
  266.      fMatchedCID.seq = cid->seq;
  267.     
  268.     return     haltEnumeration;
  269.  
  270. }
  271.  
  272.  
  273. //-----------------------------------------------------------------------------
  274. OSErr FindRecord(CRecordID& recordToFind)
  275. {
  276.  
  277.     CFindRecordEnumerator    enumerator(recordToFind);
  278.     OSErr osErr = enumerator.Enumerate();
  279.  
  280.     CreationID foundCID = enumerator.GetCID();
  281.         
  282.     if( osErr == 0 &&  foundCID != gZeroCID ) {
  283.         recordToFind.fCID.source = foundCID.source; 
  284.         recordToFind.fCID.seq = foundCID.seq;
  285.         return    0;
  286.     } else {
  287.         return kOCENoSuchRecord;
  288.     }
  289.         
  290.  
  291. }
  292.  
  293.  
  294. //•••••••••••••
  295.  
  296.  
  297.  
  298. //--------------------------------------
  299. //        m a i n 
  300. //--------------------------------------
  301.  
  302.  
  303. //-------------------------------------------------------------------------------------
  304. void main(void)
  305. {
  306.     
  307.     //    Initialize the Toolbox
  308.     
  309.         
  310.     MaxApplZone();
  311.     MoreMasters();
  312.     MoreMasters();
  313.     InitGraf(&qd.thePort);
  314.     
  315.     FlushEvents(everyEvent, 0);  
  316.     FailInfo    fi;
  317.     Try(fi) {
  318.     
  319.         gApplication = new TApplication;
  320.         gApplication->IApplication();
  321.  
  322.  
  323.         FlushEvents(everyEvent, 0);  
  324.  
  325.         //gApplication->Run();
  326.         fi.Success();
  327.         
  328.     }
  329.  
  330.  
  331.  
  332.  
  333. }
  334.  
  335.  
  336.  
  337. //--------------------------------------
  338. //        T A p p l i c a t i o n
  339. //--------------------------------------
  340.  
  341. //-------------------------------------------------------------------------------------
  342. TApplication::TApplication()
  343. {
  344.  
  345.     
  346.     fWNESleepTime = kSleepTime;
  347. }
  348.  
  349.  
  350. //-------------------------------------------------------------------------------------
  351. void TApplication::IApplication()
  352. {
  353.  
  354.  
  355.         //    Destination (extensions folder)
  356.         
  357.         
  358.     CFolder    extensionsFolder(kExtensionFolderType);
  359.  
  360.     Handle    eworldFileNameH = GetResource('STR ',128);
  361.     FailResError();
  362.     
  363.     
  364.     Str255  eworldFileName;
  365.     BlockMove(*eworldFileNameH,eworldFileName,**eworldFileNameH+1);
  366.     
  367.     CFile    destFile(0,extensionsFolder.DirID(),eworldFileName);
  368.     if( !destFile.Exists() )
  369.         FailOSErr(fnfErr);
  370.  
  371.         //    Source Folder (:Objects)
  372.  
  373.  
  374.     CFolder    sourceFolder;
  375.     FocHFSHeirarchyFromResource(128,sourceFolder);
  376.  
  377.     CFile    srcFile(0,sourceFolder.DirID(),eworldFileName);
  378.     if( !srcFile.Exists() )
  379.         FailOSErr(fnfErr);
  380.  
  381.         //    Do It
  382.  
  383.  
  384.     OSErr osErr = ExchangeFileIDs(srcFile,destFile);
  385.     
  386.     
  387.  
  388.  
  389. #ifdef JUNK
  390.     
  391.     this->InitAuth();
  392.     
  393.  
  394.     // Get  AOCE keychain catalog
  395.     
  396.     DirParamBlock dirPB;
  397.     memset(&dirPB,0,sizeof(DirParamBlock));
  398.     OSErr osErr = DirGetOCESetupRefNum(&dirPB,false);
  399.     if (osErr!=noErr) {
  400.     ///••••
  401.     }
  402.  
  403.     gKeyChainDSRefnum = dirPB.dirGetOCESetupRefNumPB.dsRefNum;
  404.     
  405.     CRecordID    msamRecord(gKeyChainDSRefnum,"eWorldMSAM","aoce MSAM");
  406.     osErr = FindRecord(msamRecord);
  407.     if( osErr == 0 )
  408.         osErr = msamRecord.Delete();
  409.     ASSERTNOERR(osErr);
  410.  
  411.  
  412.     CRecordID    slotRecord(gKeyChainDSRefnum,"eWorld Slot","aoce Mail ServiceEwrd");
  413.     osErr = FindRecord(slotRecord);
  414.     if( osErr == 0 )
  415.         osErr = slotRecord.Delete();
  416.     ASSERTNOERR(osErr);
  417.     
  418.  
  419.  
  420.     CRecordID    dirRecord(gKeyChainDSRefnum,"eWorldPMSAM","aoce DirectoryEwrd");
  421.     osErr = FindRecord(dirRecord);
  422.     if( osErr == 0 )
  423.         dirRecord.Delete();
  424.     ASSERTNOERR(osErr);
  425.  
  426.     
  427.     if( osErr != 0 ) {
  428.         MailWakeupPMSAMPB    pb;
  429.         memset(&pb,0,sizeof(MailWakeupPMSAMPB));
  430.         pb.pmsamCID.source = msamRecord.fCID.source;
  431.         pb.pmsamCID.seq = msamRecord.fCID.seq;
  432.         pb.mailSlotID = 1;    //•• guess??
  433.         osErr = MailWakeupPMSAM((MSAMParam*)&pb);
  434.     }        
  435. #endif
  436.  
  437.     
  438.     
  439.     
  440. }
  441.  
  442.  
  443.  
  444. //-------------------------------------------------------------------------------------
  445. OSErr TApplication::InitAuth(void)
  446. {
  447.     AuthParamBlock authBlock;
  448.         
  449.     OSErr osErr = AuthGetLocalIdentity(&authBlock,false);
  450.     //••• failures?
  451.     
  452.     gIdentity = authBlock.getLocalIdentityPB.theLocalIdentity;
  453.     
  454.     
  455.     return osErr;
  456. }
  457.  
  458.  
  459.  
  460.  
  461. //-------------------------------------------------------------------------------------
  462. void TApplication::Run()
  463. {
  464.     EventRecord ev;
  465.     Boolean gotEvt;
  466.     OSErr err;
  467.     long        astackspace;
  468.     
  469.     while (!gDone) {
  470.             
  471.         
  472.             gotEvt = false;
  473.             gotEvt = WaitNextEvent(highLevelEventMask,&ev,fWNESleepTime,nil);
  474.                         
  475.             if (gotEvt) {
  476.             
  477.                 err = this->HandleEvent(&ev);
  478.                 if (err == kQuitFileGateResult)
  479.                     gDone = true;
  480.                     
  481.             } else {
  482.             
  483.                 // Time to see if we got any letters put in our inBin
  484.                 astackspace= StackSpace();
  485.                 ASSERTPRINT(astackspace>1024, ("Stack is low!\n"));
  486.                 
  487.             }
  488.  
  489.         
  490.             gDone = true;
  491.     
  492.     
  493.     }
  494.     
  495.     
  496. }
  497.  
  498.  
  499.  
  500. //-------------------------------------------------------------------------------------
  501. OSErr TApplication::HandleEvent(EventRecord *ev)
  502. {
  503.     OSErr         err = noErr;
  504.     char        key;                    // the key returned from a keyDownEvent
  505.     
  506.     
  507.     switch (ev->what) {
  508.         case kHighLevelEvent:
  509.             err = this->DoHighLevelEvent(ev);
  510.             break;
  511.  
  512.  
  513.         //    Quit FileGate by pressing Cmd-Option-F
  514.         
  515.         case keyDown:
  516.             key = (char) (ev->message & charCodeMask);
  517.             if( key == 'f' ) {
  518.                 if  ( ev->modifiers & (cmdKey & optionKey) ) {
  519.                     err = kQuitFileGateResult;
  520.                 }
  521.             }
  522.         break;
  523.     }
  524.     
  525.     return err;
  526. }
  527.  
  528.  
  529.  
  530. //-------------------------------------------------------------------------------------
  531. OSErr TApplication::HandleCoreEvents(long messageID,Ptr /*buff*/,unsigned long /*msgLen*/)
  532. {
  533.  
  534.     OSErr err = noErr;
  535.     
  536.     switch (messageID) {
  537.         case kAEOpenApplication:
  538.             break;
  539.         case kAEOpenDocuments:
  540.             break;
  541.         case kAEPrintDocuments:
  542.             break;
  543.         case kAEQuitApplication:
  544.             err = noErr;
  545.             gDone = true;
  546.             break;
  547.     }
  548.     return err;
  549.     
  550. }
  551.  
  552.  
  553.  
  554.  
  555. //-------------------------------------------------------------------------------------
  556. OSErr TApplication::DoHighLevelEvent(EventRecord *ev)
  557. {
  558.     TargetID sender;
  559.     OSType messageID;
  560.     unsigned long refCon;
  561.     unsigned long msgLen;
  562.     Ptr buff;
  563.     MailEPPCMsg *mailEPPC;
  564.     
  565.     msgLen = 0;
  566.     buff = nil;
  567.     
  568.     OSErr err = AcceptHighLevelEvent(&sender,&refCon,buff,&msgLen);
  569.     if (err==bufferIsSmall) {
  570.         buff = NewPtr(msgLen);
  571.         ASSERTPRINT(buff != NULL, ("Memory error in do highlevelevent"));
  572.         err = AcceptHighLevelEvent(&sender,&refCon,buff,&msgLen);
  573.     }
  574.     
  575.         
  576.     switch (ev->message) {
  577.         
  578.     case kCoreEventClass:
  579.         err = this->HandleCoreEvents(messageID,buff,msgLen);
  580.     default:
  581.         break;
  582.     }
  583.     
  584.     DisposPtr(buff);
  585.     return err;
  586. }
  587.